package br.com.ufpr.sgp.pages;

import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.FeedbackMessagesModel;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.EmailTextField;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
import org.wicketstuff.annotation.mount.MountPath;

import br.com.sebrae.pr.sgp.entities.Usuario;
import br.com.sebrae.pr.sgp.services.UsuarioServiceRemote;
import br.com.sebrae.pr.sgp.util.exceptions.ExcecaoDeApresentacao;
import br.com.sebrae.pr.sgp.util.exceptions.ExcecaoDeNegocio;
import br.com.sebrae.pr.sgp.util.exceptions.TipoErro;
import br.com.sebrae.pr.sgp.util.exceptions.TratadorDeExcecoes;
import br.com.ufpr.util.base.BasePage;

import com.google.inject.Inject;

@MountPath("EsqueciMinhaSenha")
public class EsqueciMinhaSenhaPage extends BasePage {
    private static final long serialVersionUID = 4700333228346559075L;

    public EsqueciMinhaSenhaPage() {
        add(new EsqueciMinhaSenhaForm("esqueciMinhaSenhaForm", EsqueciMinhaSenhaPage.this));
    }

    static class EsqueciMinhaSenhaForm extends StatelessForm<EsqueciMinhaSenhaPage> {
        private static final long serialVersionUID = 8169488020462124353L;

        @Inject
        private UsuarioServiceRemote usuarioServiceRemote;

        private String nmeLogin;
//        private String desEmail;

        public EsqueciMinhaSenhaForm(final String id, final EsqueciMinhaSenhaPage page) {
            super(id);

            add(new RequiredTextField<String>("nmeLogin", new PropertyModel<String>(EsqueciMinhaSenhaForm.this, "nmeLogin")).setRequired(
                    true).setLabel(new ResourceModel("esqueciMinhaSenha.nmeLogin")));
            add(new EmailTextField("desEmail", new PropertyModel<String>(EsqueciMinhaSenhaForm.this, "desEmail")).setRequired(true)
                    .setLabel(new ResourceModel("esqueciMinhaSenha.desEmail")));

            add(new Button("btnEnviar") {
                private static final long serialVersionUID = -1443595466143521746L;

                public void onSubmit() {
                    try {
                        final Usuario usu = usuarioServiceRemote.pesquisarPorLogin(nmeLogin);
                        if (usu != null && usu.getId() > 0) {
                            usuarioServiceRemote.esqueciSenha(usu);

                            final LoginPage bp = new LoginPage();
                            bp.adicionaMensagem(TipoErro.SUCESSO, "Uma nova senha foi gerada e enviada para o email cadastrado!");
                            bp.atualizarFeedbackPanel();
                            setResponsePage(bp);

                        } else {
                            throw new ExcecaoDeNegocio("esqueceuSenha.dadosIncorretos");
                        }
                    } catch (ReplaceHandlerException e) {
                        throw e;

                    } catch (Exception e) {

                        final ExcecaoDeApresentacao ea = TratadorDeExcecoes.convertException(e);
                        page.adicionaMensagem(ea.getTipoErro() != null ? ea.getTipoErro() : TipoErro.ERRO, ea.getMensagem());
                        page.atualizarFeedbackPanel();

                    }
                }

                @Override
                public void onError() {
                    super.onError();

                    final FeedbackPanel feed = new FeedbackPanel("feedback1") {
                        private static final long serialVersionUID = -6809494832998670701L;

                        @Override
                        protected FeedbackMessagesModel newFeedbackMessagesModel() {
                            return new FeedbackMessagesModel(page);
                        }

                    };

                    for (FeedbackMessage msg : feed.getFeedbackMessagesModel().getObject()) {
                        page.adicionaMensagemErro(msg.getMessage().toString());
                    }

                    page.atualizarFeedbackPanel();
                }
            });

        }

    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.render(JavaScriptHeaderItem.forReference(getApplication().getJavaScriptLibrarySettings().getJQueryReference()));
    }
}
